iMobile 对接 Online

SuperMap Online(以下简称Online)是超图在线GIS平台,主要为用户提供在线的数据服务及GIS平台服务,帮助用户实现GIS数据的安全上云,提供丰富的工具对数据进行在线展示和分析。

SuperMap iMobile(以下简称iMobile)全面对接Online,在移动端使用Online强大的分析和展示能力,支持功能包括:

  • 地理编码/逆地理编码
  • 坐标转换
  • POI搜索
  • 公交换乘
  • 在线导航
  • 数据上传和下载

对接Online服务,需要在代码中传入密钥,获取密钥的方式如下:

(1).进入SuperMap Online主页,并的登录。若没有Online账号,需先注册。

图:登录SuperMap Online

(2).登录后,点击用户名右侧的三角,在弹出框中,选择“账户信息”。

图:查看账户信息

(3).在“账户信息”界面,选择“我的密钥”,查看和获取应用密钥。

图:查看密钥

地理编码

在地理编码中,支持正向地理编码(地理编码)和反向地理编码(逆地理编码)。

地理编码

地理编码,能够将地名或地址描述转换为地球表面上相应位置。

操作步骤:

(1).设置参数:设置GeocodingParameter类中的参数,包括setCity、setLandmark等必填参数。若源坐标类型与目标坐标类型不一致,可通过setCoordinateType方法进行坐标类型设置。

(2). 设置回调:利用setGeocodingCallback()方法,设置回调,设置前,需要先用setKey()方法,设置密钥。

(3).地理编码:调用Geocoding类中的geocoding()方法,进行地理编码。

(4).处置结果:在编码成功的回调中,处置返回的数据。

参考代码:

//①参数设置
GeocodingParameter parameter = new GeocodingParameter();    //地理编码参数
parameter.setCity("北京市");                //设置地理编码分析城市范围(必填)
parameter.setLandmark("朝阳区酒仙桥北路超图软件");          //设置地理编码分析描述(必填)
parameter.setCoordinateType(CoordinateType.NAVINFO_AMAP_MERCATOR);  //设置输出结果坐标类型
//②地理编码操作结果回调
Geocoding geocoding = new Geocoding();      //地理编码
geocoding.setKey(m_key);                    //设置密钥(必填)
geocoding.setGeocodingCallback(new Geocoding.GeocodingCallback() {
  @Override
  public void reverseGeocodeSuccess(GeocodingData data) {     //反向地理编码成功

  }
  @Override
  public void geocodeSuccess(List<GeocodingData> dataList) {  //正向地理编码成功
    //④结果处置
    final int count = dataList.size();      //获取地理编码返回元素个数
    String strRes = "";
    for (int i = 0; i < count; i++) {
      GeocodingData geocodingData = dataList.get(i);  //获取地理编码数据
      Point2D pos = geocodingData.getLocation();      //获取匹配输入地址描述的地理坐标
      String strLoc = "X:" + String.valueOf(pos.getX()) + "Y:" + String.valueOf(pos.getY()) +";";
      strRes += strLoc;
   }
   Toast.makeText(MainActivity.this, strRes, Toast.LENGTH_LONG).show();
  }
  @Override
  public void geocodeFailed(String errorMsg) {    //地理编码异常
    Toast.makeText(MainActivity.this, "地理编码失败!", Toast.LENGTH_LONG).show();
  }
});
//③进行地理编码
geocoding.geocoding(parameter);

逆地理编码

在逆地理编码中,能够将地球表面的坐标地址转换为标准地址。

操作步骤:

(1).设置回调:利用setGeocodingCallback()方法,设置回调,设置前,需要先用setKey()方法,设置密钥。

(2).逆地理编码:调用Geocoding类中的reverseGeocoding ()方法,进行逆地理编码。

(3).处置结果:在编码成功的回调中,处置返回的数据。

参考代码:

//①逆地理编码操作结果回调
Geocoding reverseGeocoding = new Geocoding();
reverseGeocoding.setKey(m_key);     //设置密钥(必填)
reverseGeocoding.setGeocodingCallback(new Geocoding.GeocodingCallback() {
  @Override
  public void reverseGeocodeSuccess(GeocodingData data) {          //反向地理编码成功
    //③结果处置
    Address address = data.getAddress();
    String city = address.getCity();
    String cuonty = address.getCounty();
    StreetNumber streetNum = address.getStreetNumber();
    String street = streetNum.getStreet();
    String number = streetNum.getNumber();
    String addressName = city + cuonty + street + number;
    Toast.makeText(MainActivity.this, addressName, Toast.LENGTH_LONG).show();
  }
  @Override
  public void geocodeSuccess(List<GeocodingData> dataList) {      //正向地理编码成功
  }
  @Override
  public void geocodeFailed(String errorMsg) {                    //地理编码异常
    Toast.makeText(MainActivity.this, "逆地理编码失败!", Toast.LENGTH_LONG).show();
  }
});
//②逆地理编码
Point2D srcPoint2D = new Point2D();
srcPoint2D.setX(Double.parseDouble("116.51221214922793"));
srcPoint2D.setY(Double.parseDouble("39.991848126454656"));
reverseGeocoding.reverseGeocoding(srcPoint2D);

坐标转换

在线进行坐标转换,支持的坐标类型包括百度经纬度,百度墨卡托,GPS经纬度, GPS墨卡托,四维、高德经纬度,四维、高德墨卡托, 搜狗墨卡托等。

操作步骤:

(1).设置参数:设置CoordinateConvertParameter类中的参数,包括setKey()、setPoint2Ds()等必填参数。若源坐标类型与目标坐标类型不一致,可通过setSrcCoordinateType()和setDestCoordinateType()方法进行坐标类型设置。

(2).设置回调:利用setConvertCallback ()方法,设置回调。

(3).坐标转换:调用CoordinateConvert类中的convert ()方法,进行坐标转换。

(4).处置结果:在转换成功的回调中,处置结果。

参考代码:

Point2Ds points = new Point2Ds();
Point2D point = new Point2D(104.073324,30.696837);
points.add(point);
//①参数设置
CoordinateConvertParameter parameter = new CoordinateConvertParameter();    //坐标转换参数
parameter.setKey(m_key);        //设置密钥(必填)
parameter.setPoint2Ds(points);  //预转换的坐标集合(必填)
parameter.setSrcCoordinateType(CoordinateType.NAVINFO_AMAP_LONGITUDE_LATITUDE); //原坐标集合的类型
parameter.setDestCoordinateType(CoordinateType.NAVINFO_AMAP_MERCATOR);          //目标坐标的类型
//②设置坐标转换回调
CoordinateConvert coordConvert = new CoordinateConvert(this);
coordConvert.setConvertCallback(new CoordinateConvert.ConvertCallback() {
  @Override
  public synchronized void convertSuccesss(Point2Ds point2Ds) { //坐标转换成功
    //④结果处置
    int count = point2Ds.getCount();
    String strRes = "";
    for (int i=0; i<count; i++){
      Point2D pnt = new Point2D();
      pnt = point2Ds.getItem(i);
      String strLoc = "X:" + String.valueOf(pnt.getX()) + "Y:" + String.valueOf(pnt.getY()) + ";";      
      strRes += strLoc;
     }
     Toast.makeText(MainActivity.this, strRes,Toast.LENGTH_SHORT).show();
  }
  @Override
  public void convertFailed(String errInfo) {     //坐标转换失败
    Toast.makeText(MainActivity.this, "坐标转换失败!", Toast.LENGTH_LONG).show();
  }
});
//③坐标转换
coordConvert.convert(parameter);

POI搜索

POI搜索服务,根据关键字或范围查询POI。

操作步骤:

(1).设置参数:设置POIQueryParameter类中的参数,包括setKey()、setKeywords ()等必填参数。若源坐标类型与目标坐标类型不一致,可通过setCoordinateType()方法进行坐标类型设置。

(2).设置回调:利用setPOIQueryCallback ()方法,设置回调。

(3).POI搜索:调用CoordinateConvert类中的convert ()方法,进行POI搜索。

(4).处置结果:在查询成功的回调中,处置结果。

(5).坐标转换(可选):若获取的结果的坐标类型与当前的坐标类型不一致,需进行坐标转换。

参考代码:

//①参数设置
POIQueryParameter queryParameter = new POIQueryParameter(); //POI查询参数
queryParameter.setKey(m_key);           //设置密钥(必填)
queryParameter.setKeywords("超图");     //设置搜索关键字(必填)
queryParameter.setCity("北京市");       //设置POI服务查询范围
queryParameter.setCoordinateType(CoordinateType.BAIDU_LONGITUDE_LATITUDE);  //设置输出结果坐标类型
//②POI查询回调
POIQuery poiQuery = new POIQuery(this);
poiQuery.setPOIQueryCallback(new POIQuery.POIQueryCallback() {
  @Override
  public void querySuccess(final POIQueryResult queryResult) { //查询成功
    //④结果处置
    final POIInfo[] poiInfos = queryResult.getPOIInfos();
    String strRes = "";
    Point2Ds point2Ds = new Point2Ds();
    for(int i=0; i<poiInfos.length; i++){
      Point2D point2D = poiInfos[i].getLocation();
      point2Ds.add(point2D);
      String name = poiInfos[i].getName() + ";" ;
      strRes += name;
     }
     Toast.makeText(MainActivity.this, strRes,Toast.LENGTH_SHORT).show();
     //⑤坐标转换(可选,略)
  }
  @Override
  public void queryFailed(String errInfo) {   //查询失败
    Toast.makeText(MainActivity.this, "POI搜索失败",Toast.LENGTH_SHORT).show();
  }
});
//③POI查询
poiQuery.query(queryParameter);

公交换乘

在线公交换乘类,查询公交路线。

操作步骤:

(1).设置参数:设置TrafficTransferParameter类中的参数。

(2).设置回调:利用setTransferCallback ()方法,设置回调。设置前,需要先用setKey()方法,设置密钥。

(3).公交换乘:调用TrafficTransferOnline类中的trafficTransfer ()方法,进行公交换乘分析。

(4).处置结果:在分析成功的回调中,处置结果。

参考代码:

Point2D startPoint=new Point2D(104.068480, 30.537340);
Point2D destPoint=new Point2D(104.073324, 30.696837);
//①参数设置
TrafficTransferParameter ttParameter = new TrafficTransferParameter();
ttParameter.setCoordinateType(CoordinateType.NAVINFO_AMAP_MERCATOR); //设置坐标类型
ttParameter.setStartName("超图软件");         //设置起点名称
ttParameter.setDestinationName("成都火车站"); //设置终点名称
ttParameter.setQueryCity("成都");              //设置公交换乘服务查询范围
ttParameter.setTrafficType(1);        //设置公交换乘策略。0表示正常模式,1表示不走地铁。
ttParameter.setResultCount(3);                //设置最大换乘方案个数
//②公交换乘回调
TrafficTransferOnline trafficTransferOnline = new TrafficTransferOnline();  //在线公交换乘
trafficTransferOnline.setKey(m_key);    //设置密钥
trafficTransferOnline.setTransferCallback(new TrafficTransferOnline.TransferCallback() {
  @Override
  public void transferSuccess(TrafficTransferOnlineData data) {   //公交换乘查询成功
    //④结果处置
    List<SolutionItem> solutionItems = data.getSolutionItems();
    int solutionItemCount = solutionItems.size();
    String strRes = "";
    for(int i=0; i<solutionItemCount; i++){
      SolutionItem solutionItem = solutionItems.get(i);   //获取换乘方案
      List<LineItems> lineItemsList = solutionItem.getLinesItems();  //具体公交换乘线路信息
      int lineItemsCount = lineItemsList.size();//   获取有多少个lineItems方案
      for(int j=0; j < lineItemsCount; j++){
        List<LineItem> lineItemList = lineItemsList.get(j).getLineItems();
        int lineItemCount = lineItemList.size();   //  获取有多少个lineItem方案
        for(int k=0;k<lineItemCount;k++){
          LineItem lineItem=lineItemList.get(k);//获取当前线路
          String strLineName=lineItem.getLineName();//得到当前分段乘坐的公交(地铁)线路名称
          String strStartStopName=lineItem.getStartStopName();//得到当前分段起始公交(地铁)站名称
          String strEndStopName=lineItem.getEndStopName();//得到当前分段终点公交(地铁)站名称
          String strDirection=lineItem.getLineDirection();//得到分段线路的方向
          String strPassStopCount=String.valueOf(lineItem.getPassStopCount());//得到总经历的站次数
          String strWalkDistance=String.valueOf(lineItem.getWalkDistance());//得到从起始点到公交(地铁)起点的步行距离
          strRes = strRes + strLineName + ";" + strStartStopName + ";" + strEndStopName + ";" + strDirection + ";" + strPassStopCount + ";" + strWalkDistance ;
        }
       }
      }
      Toast.makeText(MainActivity.this, strRes,Toast.LENGTH_SHORT).show();
    }
  @Override
  public void transferFailed(String errorInfo) {  //公交换乘查询失败
    Toast.makeText(MainActivity.this, "公交换乘分析失败",Toast.LENGTH_SHORT).show();
  }
});
//③公交换乘
trafficTransferOnline.trafficTransfer(startPoint, destPoint, ttParameter);

在线导航

在线导航,通过输入导航的起点和终点、道路类型等,规划路径和导航。

操作步骤:

(1).设置参数:设置NavigationOnlineParameter类中的参数。

(2).设置回调:利用setNavigationOnlineCallback ()方法,设置回调。设置前,需要先用setKey()方法,设置密钥。

(3).路径分析:调用NavigationOnline类中的routeAnalyst ()方法,进行路径分析。

(4).处置结果:在分析成功的回调中,处置结果。

参考代码:

Point2D startPoint = new Point2D(104.068480,30.537340);
Point2D endPoint = new Point2D(104.073324,30.696837);
//①参数设置
NavigationOnlineParameter parameter = new NavigationOnlineParameter();
parameter.setStartPoint(startPoint);    //设置路径规划的起点
parameter.setEndPoint(endPoint);        //设置路径规划的终点
parameter.setCoordinateType(CoordinateType.NAVINFO_AMAP_MERCATOR);  //设置坐标类型
parameter.setRouteType(RouteType.MIN_LENGTH);   //设置道路类型
//②在线导航回调
NavigationOnline navigationOnline = new NavigationOnline(); //在线导航
navigationOnline.setKey(m_key);     //设置密钥(必填)
navigationOnline.setNavigationOnlineCallback( new NavigationOnline.NavigationOnlineCallback() {
  @Override
  public void calculateSuccess(NavigationOnlineData data) {  //路径分析成功
    //④结果处置
    String time = data.getTime();
    String length = data.getLength();
    String strRes = time + "," + length + ":" ;
    GeoLine line =  data.getRoute();
    int nCount = line.getPartCount();
    for (int i = 0; i < nCount ; i++){
      double len = line.getLength();
      String strLen = String.valueOf(len);
      strRes = strRes + strLen + ",";
    }
    Toast.makeText(MainActivity.this, strRes,Toast.LENGTH_SHORT).show();
  }
  @Override
  public void calculateFailed(String errorInfo) {            //路径分析失败
    Toast.makeText(MainActivity.this, "路径分析失败!",Toast.LENGTH_SHORT).show();
   }
});
//③路径分析
navigationOnline.routeAnalyst(parameter);

数据上传和下载

移动端与SuperMap Online进行数据的上传和下载,数据交互前,需先调用OnlineService类的login()方法进行登录。

参考代码:

OnlineService onlineService=new OnlineService(MainActivity.this);
onlineService.login("username@supermap.com", "password", new OnlineService.LoginCallback() {
  @Override
  public void loginSuccess() {
    runOnUiThread(new Thread(){
      public void run(){
         Toast.makeText(MainActivity.this, "登陆成功!",Toast.LENGTH_SHORT).show();
      }
   });
  }
  @Override
  public void loginFailed(String s) {
   Toast.makeText(MainActivity.this, "登陆失败!",Toast.LENGTH_SHORT).show();
  }
});

数据上传

支持终端上的数据上传到服务端。使用OnlineService类中的uploadFile()方法。

参考代码:

OnlineService onlineService = new OnlineService(MainActivity.this);
//上传文件
onlineService.uploadFile("SuperMapCloud", SDCARD + "/SuperMap/data/SuperMapCloud.zip", new UpLoadFile.UpLoadListener() {
  @Override
  public void getProgress(final int i) {  //当前上传进度的百分比
    runOnUiThread(new Thread(){
      public void run(){
        Toast.makeText(MainActivity.this,String.valueOf(i),Toast.LENGTH_SHORT).show();
      }
    });
  }
  @Override
  public void onComplete() {  //上传完成
    Looper.prepare();
    Toast.makeText(MainActivity.this, "上传成功",Toast.LENGTH_SHORT).show();
    Looper.loop();
  }
  @Override
  public void onFailure() {   //上传失败
     Looper.prepare();
     Toast.makeText(MainActivity.this, "上传失败",Toast.LENGTH_SHORT).show();
     Looper.loop();
  }
});

数据下载

支持下载服务端的数据到终端。使用OnlineService类中的downloadFile ()方法。

参考代码:

//下载文件
OnlineService.downloadFile(MainActivity.this, "PearlRiverDelta", SDCARD + "/SuperMap/data/PearlRiverDelta.zip", new DownLoadFile.DownLoadListener() {
  @Override
  public void getProgress(final int i) {  //当前下载进度的百分比
    runOnUiThread(new Thread(){
      public void run(){
        Toast.makeText(MainActivity.this,String.valueOf(i),Toast.LENGTH_SHORT).show();
      }
    });
  }
  @Override
  public void onComplete() {  //下载成功
  }
  @Override
  public void onFailure() {   //下载失败
  }
});